
/*
    由于Rust中默认是move语义的，在有的场景下，我并不想转移ownership，这种情况下，可以通过引用来借用。
    引用分为两种，一种是immutable引用，一种是mutable的引用。
        通过immutable的引用，借用者不能修改；
        通过mutable的引用，借用者可以对这个变量做任何的修改，比如说赋值、swap等，唯一的一个限制就是要保证这个变量的完整性。

    Rust的安全机制要求引用在任何时候都必须有有效；同时，限制mutable引用和immutable引用不能同时存在：
    你可以有多个immutable的引用；也可以有一个mutable的引用；但是不允许有多个mutable的引用，也不允许mutable的引用和immutable的引用同时存在。
*/
#[test]
pub fn main() {
    // 1. &借用对象
    let v1 = vec![1, 2, 3, 4];
    let first = &v1[0];
    println!("first element: {}", first);

    // 2. 复制引用。
    let v2 = v1.clone();
    println!("v1 堆内存: {:p}, {:?}", v1.as_ptr(), v1);
    println!("v2 堆内存: {:p}, {:?}", v2.as_ptr(), v2);
    // 是全新的内存空间
    // v1 堆内存: 0x18f620e91c0, [1, 2, 3, 4]
    // v2 堆内存: 0x18f620e9120, [1, 2, 3, 4]

}